<?php

require_once(BaseConfig::LoadClass('conecta.class.php'      ));
require_once(BaseConfig::LoadClass('sesion.class.php'       ));
require_once(BaseConfig::LoadClass('configuracion.class.php'));

/**
 * Clase que manejará los logs del sistema
 */
class Log extends ObjetoBase {
  var $intIdLog        ;
  var $intIdUsuario    ;
  var $strFecha        ;
  var $strHora         ;
  var $strTipo         ;
  var $strResultado    ;
  var $strDescripcion  ;
  var $strObservaciones;
  var $strConsulta     ;
  var $strAdicional    ;

  function Log($intIdLog = 0) {
    $arrMapaDatos = Array();
    global $strGDBLogsPrefix;
    
    $arrMapaDatos['id_log'       ] = Array('NombreVariable' => 'intIdLog'        , 'TipoVariable' => 'I');
    $arrMapaDatos['id_usuario'   ] = Array('NombreVariable' => 'intIdUsuario'    , 'TipoVariable' => 'N');
    $arrMapaDatos['fecha'        ] = Array('NombreVariable' => 'strFecha'        , 'TipoVariable' => 'S');
    $arrMapaDatos['hora'         ] = Array('NombreVariable' => 'strHora'         , 'TipoVariable' => 'S');
    $arrMapaDatos['tipo'         ] = Array('NombreVariable' => 'strTipo'         , 'TipoVariable' => 'S');
    $arrMapaDatos['resultado'    ] = Array('NombreVariable' => 'strResultado'    , 'TipoVariable' => 'S');
    $arrMapaDatos['descripcion'  ] = Array('NombreVariable' => 'strDescripcion'  , 'TipoVariable' => 'S');
    $arrMapaDatos['observaciones'] = Array('NombreVariable' => 'strObservaciones', 'TipoVariable' => 'S');
    $arrMapaDatos['consulta'     ] = Array('NombreVariable' => 'strConsulta'     , 'TipoVariable' => 'S');
    $arrMapaDatos['adicional'    ] = Array('NombreVariable' => 'strAdicional'    , 'TipoVariable' => 'S');

    $this->__ArmarDatosPrivados($strGDBLogsPrefix . 'logs', $arrMapaDatos, 'id_log');

    $this->SeleccionarPorIndice($intIdLog);
  }

  /**
   * Función que agrega un log a la base de datos
   * @param int    $intIdUsuario Usuario que hace la operación. -1 Es sistema
   * @param String $strTipo Tipo de operación: login, observa, modifica, borra, crea, logout
   * @param String $strResultado Resultado de la operación: si fué exitoso lo que intentó hacer o no
   * @param String $strDescripcion Descripción de lo sucedido
   * @param String $strObservaciones Si existen comentarios adicionales, se ponen aquí
   * @param String $strConsulta Si existe una consulta que se ejecuó, aquí se guarda
   */
  static function AgregarLog($intIdUsuario, $strTipo, $strResultado, $strDescripcion, $strObservaciones = '', $strConsulta = '') {
    $oLog           = new Log();
    $oConfiguracion = new Config();
    /*
    if($oConfiguracion->Get('log_posible', '1') == '0') {
      return;
    }
    */

    $oLog->intIdUsuario     = $intIdUsuario;
    $oLog->strFecha         = date('Y-m-d');
    $oLog->strHora          = date('H:i:s');
    $oLog->strTipo          = $strTipo;
    $oLog->strResultado     = $strResultado;
    $oLog->strDescripcion   = $strDescripcion;
    $oLog->strObservaciones = $strObservaciones;
    $oLog->strConsulta      = $strConsulta;

    if($oConfiguracion->Get('log_info_completa', '0') == '1') {
      $strInfoAdicional  = '';
      if(isset($_SERVER['HTTP_REFERER'   ])) { $strInfoAdicional .= 'REFERER       : ' . $_SERVER['HTTP_REFERER'   ] . "<br>\n"; }
      if(isset($_SERVER['HTTP_USER_AGENT'])) { $strInfoAdicional .= 'USE_AGENT     : ' . $_SERVER['HTTP_USER_AGENT'] . "<br>\n"; }
      if(isset($_SERVER['REMOTE_ADDR'    ])) { $strInfoAdicional .= 'REMOTE_ADDR   : ' . $_SERVER['REMOTE_ADDR'    ] . "<br>\n"; }
      if(isset($_SERVER['QUERY_STRING'   ])) { $strInfoAdicional .= 'QUERY_STRING  : ' . $_SERVER['QUERY_STRING'   ] . "<br>\n"; }
      if(isset($_SERVER['REQUEST_URI'    ])) { $strInfoAdicional .= 'REQUEST_URI   : ' . $_SERVER['REQUEST_URI'    ] . "<br>\n"; }
      if(isset($_SERVER['REQUEST_METHOD' ])) { $strInfoAdicional .= 'REQUEST_METHOD: ' . $_SERVER['REQUEST_METHOD' ] . "<br>\n"; }

      $oLog->strAdicional = $strInfoAdicional;
    }

    $oLog->GuardarObjeto();
  }

  /**
   * Versión rápida para agregar logs. Se usa el usuario actualmente logueado como usuario al que se le agrega el log.
   *
   * @uses Log::AgregarLog
   *
   * @param String $strTipo Tipo de log a agregar, como en Log::AgregarLog
   * @param String $strDescripcion Descripción del evento
   * @param String $strResultado Resultado del evento agregado
   */
  static function AgregarQuickLog($strTipo, $strDescripcion, $strResultado = 'Exito') {
    global $oSesion;
    if(!$oSesion) {
      $oSesion = new Sesion();
    }
    Log::AgregarLog($oSesion->oUsuario->intIdUsuario, $strTipo, $strResultado, $strDescripcion);
  }

  /**
   * Función que obtiene los logs de un cierto usuario.
   *
   * @param String $intIdusuario Usuario al que se le obtendrán los logs
   * @param String $intLimite Limite de logs regresados (Por default, todos)
   * @param String $strSoloEsteTipo Tipo de logs regresado (Por default, todos), puede ser una lista separada por |
   * @param String $strSoloEsteResultado Obtener solo los logs que den este resultado
   *
   * @return Log[]
   */
  static function ObtenerLogs($intIdusuario, $intLimite = 0, $strSoloEsteTipo = '', $strSoloEsteResultado = '') {
    $oConecta = new Conecta();
    $arrLogs  = Array();
    global $strGDBLogsPrefix;

    $strConsulta = 'SELECT id_log FROM ' . $strGDBLogsPrefix . 'logs WHERE id_usuario = ' . ($intIdusuario - 0);
    
    if($strSoloEsteTipo != '') {
      $arrTiposResultado = explode('|', $strSoloEsteTipo);
      $strConsulta .= ' AND tipo IN (';
      foreach($arrTiposResultado as $strTipoActual) {
        $strConsulta .= "'" . OperacionesDB::CambioValoresNoPosiblesDB($strTipoActual) . "', ";
      }
      $strConsulta = substr($strConsulta, 0, -2) . ')';
    }

    if($strSoloEsteResultado != '') {
      if($strSoloEsteResultado == 'Exito') {
        $strConsulta .= ' AND resultado = \'Exito\'';
      } else {
        $strConsulta .= ' AND resultado = \'Fracaso\'';
      }
    }

    $strConsulta .= ' ORDER BY fecha DESC, hora DESC';

    if($intLimite - 0) {
      $strConsulta .= ' LIMIT ' . ($intLimite - 0);
    }

    $oConecta->Consulta($strConsulta);

    while(!$oConecta->EOF) {
      $arrLogs[] = new Log($oConecta->Field('id_log'));
      $oConecta->MoveNext();
    }

    return $arrLogs;
  }
}

?>
